#!/usr/bin/python
# -*- coding: utf-8 -*-
import MySQLdb, cgi, os, types, re, sys
import airspeed

def printPage(title, body) :
    """ печатает один или несколько тикетов
        title - заголовок страницы
        body - html-код тикетов """
    loader = airspeed.CachingFileLoader(".")
    template = loader.load_template("page.html")
    print template.merge(locals())


def escapeTuplesList(tuplesList) :
    """ заменяет специальные символы html в списке кортежей """
    for row in tuplesList :
        for key in row.keys() :
            if type(row[key]) is types.StringType :
                row[key] = cgi.escape(row[key])

def processTickets(rows) :
    escapeTuplesList(rows)

    for row in rows :
        m = regexp.match(row['description'])
        row['demo'] = m.groups()[2] if m else ""

def printSql(connection, sql, tuplesName, templateName, pageTitle, processRows) :
    """ выполняет запрос sql и отображает его с помощью шаблона templateName
        tuplesName - имя списка, отображаемого в шаблоне
        pageTitle - заголовок страницы """
    connection.query(sql)
    result = connection.store_result()

    rows = result.fetch_row(0, 1)
    if (processRows) :
        processRows(rows)

    loader = airspeed.CachingFileLoader(".")
    template = loader.load_template(templateName)
    ticketsHtml = template.merge({tuplesName: rows})

    printPage(pageTitle, ticketsHtml)

# выбор всех тикетов
ticketsSql = "SELECT id, summary, ticket_custom.value AS scrum_priority, ticket_custom_estimation.value AS scrum_estimation, description FROM ticket LEFT JOIN ticket_custom ON (ticket.id=ticket_custom.ticket AND ticket_custom.name='scrum_priority') LEFT JOIN ticket_custom AS ticket_custom_estimation ON (ticket.id=ticket_custom_estimation.ticket AND ticket_custom_estimation.name='scrum_estimation')"
# дополнительный фильтр по спринту
byMilestoneSql = "%(tickets)s WHERE milestone='%(milestone)s' AND (status='new' OR status='reopened') AND type='user-story' ORDER BY scrum_priority DESC"
# выбор конкретного тикета
byTicketIdSql = "%(tickets)s WHERE %(whereClause)s"
# выбор всех незавершенных спринтов, имя которых начинается на 'Sprint'
milestonesSql = 'SELECT name FROM milestone WHERE completed=0 AND name LIKE "Sprint%"'

form = cgi.FieldStorage()

if "getTicketTime" in form :
    if sys.platform == "win32":
        import msvcrt
        msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
    print "Content-Type: image/png;\n"
    # используем не print, потому что print после картинки дописывает 0x0A
    image = '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00K\x00\x00\x00K\x01\x03\x00\x00\x00\x02\x80\xe8\xa9\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\x06PLTE\xdd\xdd\xdd\x00\x00\x00\xae\x9cl\x92\x00\x00\x00\x1cIDAT8\xcbc\xf8\x0f\x03\x0f\x18\x1a\x18\xa0@a\x949\xca\x1ceba"r\x0b\x00\xbf\xd6AO\x01r\x92\xe5\x00\x00\x00\x00IEND\xaeB`\x82'
    sys.stdout.write(image)

else :
    import config
    connection =MySQLdb.connect(host=config.host, user=config.user, passwd=config.passwd, db=config.db, charset=config.charset, use_unicode=config.use_unicode)

    regexp = re.compile("(.*)(Демо:\\n)(.*)", re.MULTILINE | re.DOTALL)

    print "Content-Type: text/html; charset=utf-8\n"

    if "milestone" in form :
        milestoneName = form["milestone"].value
        printSql(connection, byMilestoneSql % {'milestone': milestoneName, 'tickets': ticketsSql}, "tickets", "ticket.html", form["milestone"].value, processTickets)

    elif "tickets" in form :
        tickets = form["tickets"].value
        whereClause = "id in (%s)" % tickets
        printSql(connection, byTicketIdSql % {'whereClause': whereClause, 'tickets': ticketsSql}, "tickets", "ticket.html", "Тикет(ы) "+tickets, processTickets)

    else :
        printSql(connection, milestonesSql, "milestones", "forms.html", "Распечатка тикетов", None)

    connection.close()
